import * as CryptoJS from 'crypto-js'
const md5 = CryptoJS.MD5

const objKeySort = (arys: any) => {
  // 先用Object内置类的keys方法获取要排序对象的属性名，再利用Array原型上的sort方法对获取的属性名进行排序，newkey是一个数组
  const newkey = Object.keys(arys).sort()
  // console.log('newkey='+newkey)
  const newObj: any = {} // 创建一个新的对象，用于存放排好序的键值对
  for (let i = 0; i < newkey.length; i++) {
    // 遍历newkey数组
    newObj[newkey[i]] = arys[newkey[i]]
    // 向新创建的对象中按照排好的顺序依次增加键值对
  }
  return newObj // 返回排好序的新对象
}

const salt = [
  '你是什么口味的？', '惊奇', '马提琴', '干男骑乘', '毛豆拉面大芒果', '玲娜贝儿', '数字签名', 'momo', 'ISPA', 'Furry'
]

function foo (data: any) {
  let flag = 0
  let str = ''
  if (data instanceof Array) {
    // 如果是数组
    data.map((e) => {
      if (flag > 0) str += ', ' // 在每一个值前面加上分割
      str += `(${foo(e)})`
      flag += 1
    })
  } else if (data instanceof Object) {
    for (const key in data) {
      if (flag > 0) str += ', ' // 在每一个值前面加上分割
      if (typeof (data[key]) === 'object') {
        str += `${key}: (${foo(data[key])})`
      } else {
        str += `${key}: ${data[key]}`
      }
      flag += 1
    }
  }
  return str
}

export function signatureFoo (data) {
  const timeStamp = +new Date()
  const targetData = objKeySort(data)
  /**
   * 1. 时间戳：精确到毫秒
   * 2. 参数：字典排序
   * 3. 生成字符串：userkey: mitkimi, password: 123456, source: admin
   * 4. 取时间戳最后两位，在字典中取字符串，放在 3 字符串头尾，加号链接
   * 5. 在最后加上时间戳，用加号链接
   * 6. 进行一次 MD5(32)加密，并转为大写
   */
  const buffer = timeStamp.toString().split('')
  const headIndex = buffer[buffer.length - 2]
  const tailIndex = buffer[buffer.length - 1]
  // 生成字符串
  let str = ''
  str = foo(targetData)
  str = `${salt[headIndex]}+${str}+${salt[tailIndex]}+${timeStamp}`
  const signature = md5(str).toString().toUpperCase()
  return {
    signature, timeStamp
  }
}
